package controllers;

import play.*;
import play.cache.Cache;
import play.data.validation.*;
import play.data.validation.Error;
import play.libs.Mail;
import play.mvc.*;

import java.util.*;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

import models.*;

public class Utilisateurs extends Application
{
	// Profil de l'utilisateur
	public static void index()
	{
		Utilisateur user = Utilisateur.find("byPseudo", Security.connected()).<Utilisateur>first();
		
		if(user != null)
		{
			Modele_bateau modele = Modele_bateau.find("byUtilisateur", user).first();
			List<Course> courses = user.getCourseParicipe();
			render(user, modele, courses);
		}
		else
		{
			render("errors/Authentification.html");
		}
	}	
	
	// Changer le mot de passe
	public static void changerEmail()
	{
		Utilisateur user = Utilisateur.find("byPseudo", Security.connected()).<Utilisateur>first();
		
		if(user != null)
		{
			String email = user.email;
			render(email);
		}
		else
		{
			render("errors/Authentification.html");
		}		
	}
	
	// Valide le changement de mot de passe
	public static void changerEmailAction(@Required 
										  @Email
										  String email)
	{
		Utilisateur user = Utilisateur.find("byPseudo", Security.connected()).<Utilisateur>first();
		if(user != null)
		{
			if(validation.hasErrors())
			{
				render("Utilisateurs/changerEmail.html", email);
			}
			else
			{
				String message = "";
				try {
					SimpleEmail email_ojb = new SimpleEmail();
					email_ojb.setFrom("administration@transat.com");
					email_ojb.addTo(email);
					email_ojb.setSubject("Votre mot de passe Transat");
					email_ojb.setMsg("Votre adresse email a été modifiée et validée ! A bientôt sur Transat !");
					Mail.send(email_ojb); 
					user.email = email;
					user.save();
					Utilisateurs.index();					
				} catch (EmailException e) {
					message = "L'adresse email ne peut être vérifiée. Assurez-vous de sa validité";
					render("Utilisateurs/changerEmail.html", email, message);
				}
			}			
		}
		else
		{
			render("errors/Authentification.html");
		}
	}	
	
	// Changer le mot de passe
	public static void changerMdp()
	{
		Utilisateur user = Utilisateur.find("byPseudo", Security.connected()).<Utilisateur>first();
		
		if(user != null)
		{
			render();
		}
		else
		{
			render("errors/Authentification.html");
		}		
	}	
	
	// Valide le changement de mot de passe
	public static void changerMdpAction(@Required 
										@MaxSize(20) 
										@MinSize(5)
									String motDePasse,
										@Required
										@Equals("motDePasse") 
									String confirmMotDePasse)
	{
		Utilisateur user = Utilisateur.find("byPseudo", Security.connected()).<Utilisateur>first();
		if(user != null)
		{
			if(validation.hasErrors())
			{
				render("Utilisateurs/changerMdp.html", motDePasse);
			}
			else
			{
				user.mdp = motDePasse;
				user.save();
				Utilisateurs.index();					
			}			
		}
		else
		{
			render("errors/Authentification.html");
		}
	}	
	
	// Formulaire d'enregistrement
	public static void inscription()
	{
		List<Couleur> couleurs = Couleur.findAll();
		render(couleurs);
	}
	
	// Enregistre un nouveau membre
	public static void inscriptionAction(@Required 
										@MaxSize(50)
										@MinSize(3)
									String pseudo,
										@Required 
										@MaxSize(20) 
										@MinSize(5)
									String motDePasse,
										@Required
										@Equals("motDePasse") 
									String confirmMotDePasse,
										@Required 
										@Email
									String email,
										@Required
										@MaxSize(50)
										@MinSize(3)
									String nomBateau,
									int couleur_id)
	{
		List<Couleur> couleurs = Couleur.findAll();
		
		if(validation.hasErrors())
		{
			render("Utilisateurs/inscription.html", pseudo, email, nomBateau, couleurs);
		}
		
		else
		{
			String message = "";
			
			if(Modele_bateau.find("byNom", nomBateau).first() != null)
			{
				message = "Ce nom de bateau n'est pas disponnible";
				render("Utilisateurs/inscription.html", pseudo, email, nomBateau, message, couleurs);
			}			
			if(Utilisateur.find("byPseudo", pseudo).first() != null)
			{
				message = "Ce pseudo n'est pas disponnible";
				render("Utilisateurs/inscription.html", pseudo, email, nomBateau, message, couleurs);
			}
			if(Utilisateur.find("byEmail", email).first() != null)
			{
				message = "Cette adresse email est déjà utilisée";
				render("Utilisateurs/inscription.html", pseudo, email, nomBateau, message, couleurs);
			}			
			else
			{
				try {
					SimpleEmail mail = new SimpleEmail();
					mail.setFrom("inscription@transat.com");
					mail.addTo(email);
					mail.setSubject("Inscription confirmée");
					mail.setMsg("Votre inscription sur le site Transat est confirmée. Vous pouvez dès à présent vous authentifier pour commencer à jouer !");
					Mail.send(mail); 
					
					Utilisateur user = new Utilisateur(pseudo, motDePasse, email, null, false).save();
					Modele_bateau modele = new Modele_bateau((Couleur) Couleur.find("byId", (long)couleur_id).first(), nomBateau, user).save();
					user.modele_bateau = modele;
					user.save();
					inscriptionReussie();							
					
				} catch (Exception e) {
					message = "Email non valide";
					render("Utilisateurs/inscription.html", pseudo, email, nomBateau, message, couleurs);
				}
			}
		}  	
	}
	
	// Envoi un e-mail de confirmation
	public static void inscriptionReussie()
	{
		render();
	}
	
	// Formulaire de récupération du mot de passe
	public static void mdpPerdu()
	{
		render();
	}
	
	// Envoi un e-mail de récupération du mot de passe
	public static void mdpPerduAction(String mail)
	{
		Utilisateur user = Utilisateur.find("byEmail", mail).<Utilisateur>first();
		String message = "";
		
		if(user != null)
		{
			String mdp = user.mdp;
			
			try {
				SimpleEmail email = new SimpleEmail();
				email.setFrom("mailrecovery@transat.com");
				email.addTo(mail);
				email.setSubject("Votre mot de passe Transat");
				email.setMsg("Voici votre mot de passe : " + mdp);
				Mail.send(email); 
				
				message = "Votre mot de passe vous a été envoyé à l'adresse " + mail;
				
			} catch (EmailException e) {
				message = "Une erreur s'est produite, contactez l'administrateur";
			}
		}
		else
		{
			message = "Cette adresse email ne correspond à aucun utilisateur";			
		}

		render(message);		
	}
}
